애플리케이션을 새로 시작하지 않고 특정 SQL의 내용만을 변경하고 싶다면 어떻게 해야 할지 생각해보자. 더불어 기존에 설계하고 개발했던 기능이 발전돼야 할 경우에 스프링답게 접근하는 방법이 무엇인지를 알아보자.

DI와 기능의 확장

지금까지 사용한 DI는 특별한 기술보다는 일종의 디자인 패턴 또는 프로그래밍 모델이라는 관점에서 이해하는 것이 더 자연스럽다.
DI에 적합한 오브적트 설계를 통해 DI의 가치를 제대로 알아보자.

DI를 의식하는 설계

적절한 책임에 따라 오브젝트를 분리하고, 항상 의존 오브젝트는 자유롭게 확장될 수 있다는 점을 염두해 두어야 한다. DI는 런타임 시에 의존 오브젝트를 다이내믹하게 연결해줘서 유연한 확장을 꾀하는 게 목적이기 때문에 항상 확장을 염두에 두고 오브젝트 사이의 관계를 생각해야 한다.

DI와 인터페이스 프로그래밍

DI를 적용할 때는 가능한 한 인터페이스를 사용해야한다. 다형성을 얻기 위함과 더불어 클라이언트와 의존 오브젝트 사이의 관계를 명확하게 해줄 수 있기 때문이다.

목적과 관심이 각기 다른 클라이언트가 있다면, 인터페이스를 통해 이를 적절하게 분리해줄 필요가 있고, 이를 객체지향 설계 원칙에서는 인터페이스 분리 원칙이라고 부른다.

인터페이스 상속

하나의 오브젝트가 구현하는 인터페이스를 여러 개 만들어서 구분하는 이유중의 하나는 다른 종류의 클라이언트가 등장하기 때문이다. 때로는 여러개 만드는 대신 기존 인터페이스를 상속을 통해 확장하는 방법도 사용된다.